<!DOCTYPE html>
<html>
<head>
	<title>设计模式</title>
	<meta charset="utf-8">
</head>
<body>
什么是设计模式

	创建型 	工厂模式、单例模式、原型模式
	结构型 	适配器模式、代理模式
	行为型 	策略模式、迭代器模式、观察者模式(发布-订阅模式)、命令模式、状态模式

工厂模式：
    优点：逻辑简单
    缺点：
        1.对象都需要重新定义，内存浪费。
        2.不能创建公共属性。
<script>
	function createCar(name,color,price){
	  var tempcar=new Object();
	  tempcar.name=name;
	  tempcar.color=color;
	  tempcar.price=price;
	  tempcar.getName=getName;
	  return tempcar;
	}
	function getName(){
		document.write(this.name+"-----"+this.color+"<br>");
	}
	var car1=new createCar("工厂桑塔纳","red","121313");
	car1.getName();
</script>
构造模式：
    1.在功能上和普通函数没有区别，但是为了和普通函数进行区分，命名选择用大驼峰命名法。
    2.new干了什么
        1.隐式创建一个中间对象this
        2.this指向实例对象
        3.隐式return this
            如果手动返回return的值，那么对于原始值无效，只对引用类型生效。
    3.new 主要用来创建对象，创建的过程就是执行构造函数。只是比普通函数多了几步。
<script>
	function Car(name,color,price){

	  this.name=name;
	  this.color=color;
	  this.price=price;
	  this.getColor=function(){
	   document.write(this.name+"-----"+this.color+"<br>");
	  };
	  
	}
	var car2=new Car("构造桑塔纳","red","121313");
	car2.getColor(); 
</script>

原型模式:用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象
<script>
	var prototype = {
	    name: 'Jack',
	    getName: function() {
	        return this.name
	    }
	}

	var obj = Object.create(prototype, {
	    job: {
	        value: 'IT'
	    }
	})

	console.log(obj.getName())  // Jack
	console.log(obj.job)  // IT
	console.log(obj.__proto__ === prototype)  //true
</script>

单例模式：保证一个类仅有一个实例，并提供一个访问它的全局访问点。
	主要思想就是，实例如果已经创建，则直接返回
<script>
	var SingleTon = function(name){ //创建一个对象
	    this.name = name;
	    this.instance = null;
	};
	SingleTon.prototype.getName = function(){
	    alert(this.name);
	};
	SingleTon.getInstance = function(name){
	    if(!this.instance){
	    	console.log(this.instance)
	        this.instance = new SingleTon(name);
	        console.log(this.instance);
	    }
	    return this.instance;
	};
	 
	var a = SingleTon.getInstance( 'instance1' );
	var b = SingleTon.getInstance( 'instance2' );
	// console.log(b);
	// console.log(a);
	console.log(a.name);
	console.log(b.name);
	

</script>
</body>
</html>